package com.demo.gulimall.product.controller;

import com.demo.gulimall.common.utils.R;
import com.demo.gulimall.common.valid.AddGroup;
import com.demo.gulimall.product.entity.Brand;
import com.demo.gulimall.product.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * @author Chen Yuan
 * @create 2023-05-24  14:26
 */
@RestController
public class BrandController {

	@Autowired
	private BrandService brandService;

	/**
	 * 使用 JSR303 校验注解进行校验
	 * 1. 在实体类上添加校验注解
	 * 2. 在入参对象前使用 @Valid 开启校验
	 * 3. 在需要校验的对象后, 紧跟一个 BindResult 可以获取校验结果
	 * 4. 使用统一的异常处理类, 处理校验异常
	 * 5. 校验分组(比如说主键ID, 新增时可以为空, 更新时不能为空), 使用 @Validated 指定走哪一个分组, 没有标注分组的字段不走校验
	 * 6. 自定义校验注解
	 *  6.1 编写一个自定义的检验注解
	 *  6.2 编写一个自定义的校验器
	 *  6.3 关联自定义的校验器和校验注解
	 */
	public R saveBrand(@Validated(AddGroup.class) @RequestParam Brand brand, BindingResult result){

		// 字段校验异常使用 ExceptionControllerAdvice 统一处理
		//if (result.hasErrors()) {
		//	// 遍历校验出错的字段
		//	for (FieldError fieldError : result.getFieldErrors()) {
		//		// 获取错误信息
		//		String defaultMessage = fieldError.getDefaultMessage();
		//		// 获取出错的字段名
		//		String field = fieldError.getField();
		//	}
		//}

		boolean save = brandService.save(brand);
		return R.ok(String.valueOf(save));
	}
}
